package com.minio.starter.service.impl;


import com.minio.starter.config.DirectoryNameConfig;
import com.minio.starter.domain.MinioItem;
import com.minio.starter.service.MinioService;
import com.minio.starter.template.MinioTemplate;
import io.minio.Result;
import io.minio.errors.*;
import io.minio.messages.Item;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author theOS
 * @date 2021/10/28
 */
@Service
public class MinioServiceImpl implements MinioService {
    @Autowired
    private MinioTemplate minioTemplate;

    /**
     * 获取上传URL
     *
     * @param bucketName 桶名称
     * @param objectName 文件名称
     * @param expire     URL有效期
     * @param dateDir    是否创建日期目录 1-》是，其他否。
     * @return 上传url
     * @throws Exception
     */
    @Override
    public String getUploadUrl(String bucketName, String objectName, Integer expire, Integer dateDir) throws Exception {
        StringBuilder dateDirName = new StringBuilder();
        if (dateDir != null && dateDir == 1) {
            dateDirName.append(DirectoryNameConfig.getYear());
            dateDirName.append(DirectoryNameConfig.SPLIT);
            dateDirName.append(DirectoryNameConfig.getMonth());
            dateDirName.append(DirectoryNameConfig.SPLIT);
            dateDirName.append(DirectoryNameConfig.getDay());
            dateDirName.append(DirectoryNameConfig.SPLIT);
        }
        dateDirName.append(objectName);
        return minioTemplate.presignedPutObject(bucketName, dateDirName.toString(), expire);
    }

    /**
     * 获取临时URL
     *
     * @param bucketName 同名称
     * @param objectName 文件名
     * @param expires    URL有效期 秒
     * @return url
     */
    @Override
    public String getObjectUrl(String bucketName, String objectName, Integer expires) throws Exception {
        return minioTemplate.getObjectURL(bucketName, objectName, expires);

    }

    /**
     * 删除文件
     *
     * @param bucketName 桶名称
     * @param objectName 文件名
     */
    @Override
    public void removeObject(String bucketName, String objectName) throws Exception {
        minioTemplate.removeObject(bucketName, objectName);
    }

    /**
     * 根据前缀查询文件或文件夹信息。
     *
     * @param bucketName 桶名称
     * @param prefix     前缀
     * @param recursive  是否递归
     * @return MinioItem
     */
    @Override
    public List<MinioItem> getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive) {
        List<MinioItem> minioItemList = new ArrayList<>();
        Iterable<Result<Item>> objects = minioTemplate.getAllObjectsByPrefix(bucketName, prefix, recursive);
        objects.forEach(itemResult -> {
            try {
                minioItemList.add(new MinioItem(itemResult.get()));
            } catch (ErrorResponseException
                    | InsufficientDataException | InternalException | InvalidKeyException
                    | InvalidResponseException | IOException | NoSuchAlgorithmException
                    | ServerException | XmlParserException e) {
                e.printStackTrace();
            }
        });
        return minioItemList;
    }
}
